package com.example.onlinemusic.controller;

import com.example.onlinemusic.mapper.MusicMapper;
import com.example.onlinemusic.model.Music;
import com.example.onlinemusic.model.User;
import com.example.onlinemusic.service.MusicService;
import com.example.onlinemusic.tools.Constant;
import com.example.onlinemusic.tools.ResponseBodyMessage;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.binding.BindingException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.net.BindException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@RequestMapping("/music")
@RestController
public class MusicController {
    @Autowired
    private MusicService musicService;

    @Value("${music.local.path}")
    private String SAVE_PATH/*="E:/javaEE/springBookMaven/music1/"*/;

//    上传音乐
    @RequestMapping("/upload")
    public ResponseBodyMessage<Boolean> insertMusic(@RequestParam String singer,
                                                    @RequestParam("filename") MultipartFile file,
                                                    HttpServletRequest request,
                                                    HttpServletResponse resp) throws IOException {
        //1、检查是否登录了
        HttpSession httpSession = request.getSession(false);
        if(httpSession==null||httpSession.getAttribute(Constant.USERINFO_SESSION_KEY)==null){
            return new ResponseBodyMessage<>(-1,"请登陆后上传",false);
        }

        //2、先查询数据库当中，是否有当前音乐【歌曲名——歌手】
        //


        String fileNameAndType=file.getOriginalFilename();//xx.mp3

        System.out.println("fileNameAndType"+fileNameAndType);

        String path=SAVE_PATH+"/"+fileNameAndType;

        File dest=new File(path);

        if(!dest.exists()){
            dest.mkdir();
        }

        try {
            file.transferTo(dest);
//            return new ResponseBodyMessage<>(0,"服务器上传成功",true);
        } catch (IOException e) {
            e.printStackTrace();
            return new ResponseBodyMessage<>(-1,"服务器上传失败！",false);
        }

        //进行数据库的上传
        //1、准备数据   2、调用insert
        int index = fileNameAndType.lastIndexOf(".");//lastIndexOf
        String title = fileNameAndType.substring(0,index);

        User user = (User)httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);
        int userid = user.getId();

        //播放音乐-》http请求
        String url = "/music/get?path="+title;

        SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd");
        //把当前日期以sf这种格式写进time(获取年月日)
        String time=sf.format(new Date());
        try {
            int ret = 0;
            if (musicService.selectByTitleAndSinger(title,singer)==null){
                ret= musicService.insert(title, singer, time, url, userid);
            }
            if (ret == 1) {
//                跳转到音乐列表界面
                resp.sendRedirect("/list.html");
                return new ResponseBodyMessage<>(0, "数据库上传成功！", true);
            } else {
                return new ResponseBodyMessage<>(-1, "数据库上传失败！", false);
            }
        }catch (BindingException e){
            dest.delete();
            return new ResponseBodyMessage<>(-1, "数据库上传失败！", false);
        }
    }

    @RequestMapping("/get")
    public ResponseEntity<byte[]> get(String path){
        File file = new File(SAVE_PATH+"/"+path);
        byte[] a = null;
        try {
            a = Files.readAllBytes(file.toPath());
            if(a == null) {
                return ResponseEntity.badRequest().build();
            }
            return ResponseEntity.ok(a);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResponseEntity.badRequest().build();

//        return ResponseEntity.internalServerError().build();//500
//        return ResponseEntity.notFound().build();//404
//        return  ResponseEntity.ok(a);
    }

//    删除单个音乐
    @RequestMapping("/delete")
    public ResponseBodyMessage<Boolean> deleteMusicId(@RequestParam String id){

        //1、先检查音乐是否存在
        int iid=Integer.parseInt(id);

        //2、存在就要删除
        Music music=musicService.findMusicById(iid);

        if(music==null){
            System.out.println("没有这个id的音乐");
            return new ResponseBodyMessage<>(-1,"没有你要删除的音乐",false);
        }else{
            // 2.1删除数据库
            int ret=musicService.deleteMusicById(iid);
            if(ret==1){

                // 2.2删除服务器上数据
                int index=music.getUrl().lastIndexOf("=");
                String filename=music.getUrl().substring(index+1);

                File file=new File(SAVE_PATH+"/"+filename+".mp3");
                System.out.println("当前的路径"+file.getPath());

                if(file.delete()){
                    //同步删除lovemusic表中的这个音乐
                    musicService.deleteLoveMusicByMusicId(iid);
                    return new ResponseBodyMessage<>(0,"服务器当中的音乐删除成功",true);
                }else{
                    return new ResponseBodyMessage<>(-1,"服务器当中的音乐删除失败",false);
                }

            }else{
                return new ResponseBodyMessage<>(-1,"服务器当中的音乐没有被删除成功！",false);
            }

        }
    }

//    批量删除
    @RequestMapping("/deleteSel")
    public  ResponseBodyMessage<Boolean> deleteSelMusic(@RequestParam("id[]") List<Integer> id){
        System.out.println("所有的ID:"+id);
        int sum=0;
        for(int i=0;i<id.size();i++){
            int musicId=id.get(i);
            Music music=musicService.findMusicById(musicId);
            if(music==null){
                System.out.println("没有这个id的音乐");
                return new ResponseBodyMessage<>(-1,"没有你要删除的音乐",false);
            }
            int ret=musicService.deleteMusicById(musicId);
            if(ret==1){
                int index=music.getUrl().lastIndexOf("=");
                String filename=music.getUrl().substring(index+1);

                File file=new File(SAVE_PATH+"/"+filename+".mp3");
                if(file.delete()){
                    musicService.deleteLoveMusicByMusicId(musicId);
                    sum+=1;
                    //return new ResponseBodyMessage<>(0,"服务器当中的音乐删除成功",true);
                }else{
                    return new ResponseBodyMessage<>(-1,"服务器当中的音乐删除失败",false);
                }
            }else{
                return new ResponseBodyMessage<>(-1,"数据库当中的音乐删除失败",false);
            }
        }
        if(sum==id.size()){
            System.out.println("整体删除成功！");
            return new ResponseBodyMessage<>(0,"音乐删除成功",true);
        }else{
            System.out.println("整体删除失败");
            return new ResponseBodyMessage<>(-1,"音乐删除失败",false);
        }
    }

    @RequestMapping("/findmusic")
    public ResponseBodyMessage<List<Music>> findMusic(@RequestParam(required = false) String musicName){
        List<Music> musicList=null;
        if(musicName!=null){
            musicList=musicService.findMusicByName(musicName);
        }else{
            musicList=musicService.findMusic();
        }
        return new ResponseBodyMessage<>(0,"查询到了所有的音乐",musicList);
    }
}
